#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QPixmap>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //初始化人脸识别引擎对象
    static ModelSetting FD_model("C:/SeetaFace/bin/model/fd_2_00.dat",SEETA_DEVICE_AUTO);
    static ModelSetting PD_model("C:/SeetaFace/bin/model/pd_2_00_pts5.dat",SEETA_DEVICE_AUTO);
    static ModelSetting FR_model("C:/SeetaFace/bin/model/fr_2_10.dat",SEETA_DEVICE_AUTO);
    engin=new FaceEngine(FD_model, PD_model, FR_model);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    //弹出文件对话框
    srcfilename=QFileDialog::getOpenFileName(this,"人脸图片对话框");
    //在标签上显示
    QPixmap map(srcfilename);
    map.scaled(ui->srclb->width(),ui->srclb->height());
    ui->srclb->setScaledContents(true);
    ui->srclb->setPixmap(map);
}

void MainWindow::on_pushButton_2_clicked()
{
    //弹出文件对话框
    destfilename=QFileDialog::getOpenFileName(this,"人脸图片对话框");
    //在标签上显示
    QPixmap map(destfilename);
    map.scaled(ui->destlb->width(),ui->destlb->height());
    ui->destlb->setScaledContents(true);
    ui->destlb->setPixmap(map);
}


void MainWindow::on_pushButton_4_clicked()
{
    //cv是opencv里面的命名空间 Mat表示矩阵图
    cv::Mat destData = imread(destfilename.toUtf8().data()); //目标图路径保存到Mat对象中
    //把opencv的Mat数据转seetaface数据
    SeetaImageData seetaData; //SeetaImageData类型是seetaface库提供的类，用来存放人脸图片数据
    seetaData.data = destData.data;  //图像数据赋值
    seetaData.width = destData.cols; //图片的宽
    seetaData.height = destData.rows; //图片的高
    seetaData.channels =  destData.channels(); //图片像素通道(比如：图片像素点每个占3个字节，通道就是3)

    int64_t index; //存放图片的ID号
    float similarity; //存放识别得到的相似度可信度
    //参数依次： 要识别的目标图片， 一张图片， 在人脸库中查找到的id， 可信度(相似度)
    int ret = engin->QueryTop(seetaData,1,&index,&similarity); //查询注册的人脸库，比对人脸数据
    if(ret < 0)
    {
        qDebug()<<"识别失败";
    }
    else //识别成功
    {
        qDebug()<<"两张图片的相似度是："<<similarity<<"  图片的ID是: "<<index;
//        //在标签上把相似度显示出来
//        QString str=QString("相似度:%1").arg(similarity);
//        ui->label->setText(str);
    }
}

void MainWindow::on_pushButton_5_clicked()
{
    //cv是opencv里面的命名空间 Mat表示矩阵图
    cv::Mat srcData = imread(srcfilename.toUtf8().data()); //读取人脸原图数据保存到Mat对象中
    //把opencv的Mat数据转seetaface数据
    SeetaImageData seetaData; //SeetaImageData类型是seetaface库提供的类，用来存放人脸图片数据
    seetaData.data = srcData.data;  //图像数据赋值
    seetaData.width = srcData.cols; //图片的宽
    seetaData.height = srcData.rows; //图片的高
    seetaData.channels =  srcData.channels(); //图片像素通道(比如：图片像素点每个占3个字节，通道就是3)
    int64_t id = engin->Register(seetaData); //把人脸数据注册到人脸库
    qDebug()<<"你注册的人脸ID号是: "<<id;
}
